//David Hsieh #08225
//Hoja de Trabajo #1

/**
 *
 * @author dvdhl89
 * @param <E>
 */
public class Espacio <E> implements InterfazGenerica<E>{

    private Object[] elementos;
    private int disponibles, actual, id;

//    Metodo constructor que recibe cantidad de espacio e id(indice)
    /**
     * 
     * @param cantidad
     * @param id
     */
    public Espacio(int cantidad, int id) {
        elementos = new Object[cantidad];
        disponibles = cantidad;
        this.id = id;
        actual = 0;
    }

//    Metodo contructor que recibe solo la cantidad de espacio
    /**
     *
     * @param cantidad
     */
    public Espacio(int cantidad) {
        elementos = new Object[cantidad];
        disponibles = cantidad;
        this.id = 0;
        actual = 0;
    }

//    Metodo que agrega un objeto al espacio
    /**
     *
     * @param dato
     */
    public void agregar(E dato){
        elementos[actual] = dato;
        
        actual ++;
        disponibles --;
    }

//    Metodo que devuele el ultimo objeto agregado en el espacio
    /**
     *
     * @return
     */
    public E verUltimo() {
        if(actual > 0)
            return (E) elementos[actual-1];
        return null;
    }

//    Metodo que devuelve y retira el ultimo objeto agregado en el espacio
    /**
     *
     * @return
     */
    public E retirar() {

        actual --;
       
        disponibles ++;

        return (E) elementos[actual];
    }

//    Metodo que verifica si el espacio esta lleno, si lo esta devuelve true
    /**
     *
     * @return
     */
    public boolean lleno() {
        //if(actual >= elementos.length-1)
        if(disponibles <= 0)
            return true;
        return false;
    }

//    Metodo que verifica si el espacio esta vacio, si lo esta devuelve true
    /**
     *
     * @return
     */
    public boolean vacio() {
        if(actual <= 0)
            return true;
        return false;
    }

//    Metodo que devuelve la cantidad de objetos que hay en el espacio
    /**
     *
     * @return
     */
    public int cantidad() {
        return actual;
    }

//    Metodo que recibe un objeto y lo busca en el espacio, si este esta, devuelve
//    el indice de la posicion, si no lo esta, devuelve -1
    /**
     *
     * @param dato
     * @return
     */
    public int buscar(E dato) {
        for(int i=0; i <= actual; i++) {
            if(elementos[i].equals(dato))
                return i;
        }
        return -1;
    }

//    Metodo que devuelve el objeto que se encuentra en el indice especificado
    /**
     *
     * @param index
     * @return
     */
    public E getObjeto(int index) {
        if(index < elementos.length && index >= 0)
            return (E) elementos[index];
        return null;
    }
    

}
